package com.byron;

import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.xssf.streaming.SXSSFWorkbook;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.joda.time.DateTime;
import org.junit.Test;

import java.io.FileOutputStream;
import java.io.IOException;

/**
* 测试poi操作excel
*
* @author byron
* @since 2024/8/21 9:42
*/
public class ExcelWriteTest {

    String path = System.getProperty("user.dir");


    /**
    * 测试写excel03-HSSFWorkbook
    *
    * @author byron
    * @since 2024/8/21 9:43
    */
    @Test
    public void testWrite03() throws IOException {

        //1、创建新的Excel 工作簿
        HSSFWorkbook workbook = new HSSFWorkbook();

        // 在Excel工作簿中建一工作表，其名为缺省值 Sheet0
        //Sheet sheet = workbook.createSheet();

        //2、如要新建一名为"会员登录统计"的工作表，其语句为：
        HSSFSheet sheet = workbook.createSheet("观众统计表");


        //3、创建行（row 1）

        HSSFRow row1 = sheet.createRow(0);


        //4、创建单元格（col 1-1）
        HSSFCell cell11 = row1.createCell(0);
        cell11.setCellValue("今日新增关注");

        // 创建单元格（col 1-2）
        HSSFCell cell12 = row1.createCell(1);
        cell12.setCellValue(999);


        // 创建行（row 2）
        Row row2 = sheet.createRow(1);

        // 创建单元格（col 2-1）
        Cell cell21 = row2.createCell(0);
        cell21.setCellValue("统计时间");

        //创建单元格（第三列）
        Cell cell22 = row2.createCell(1);

        String dateTime = new DateTime().toString("YYYY-MM-dd HH:mm:ss");
        cell22.setCellValue(dateTime);

        FileOutputStream fileOutputStream = new FileOutputStream(path+"/观众统计表03.xls");

        workbook.write(fileOutputStream);

        fileOutputStream.close();
        System.out.println("文件生成成功！");
    }



    /**
     * 测试写excel07-XSSFWorkbook
     *
     * @author byron
     * @since 2024/8/21 9:43
     */
    @Test
    public void testWrite07() throws IOException {

        //和03版唯一的区别是创建类型不同 XSSFWorkbook，HSSFWorkbook
        // 文件后缀名不同

       //1、创建新的Excel 工作簿
        Workbook workbook = new XSSFWorkbook();

        // 在Excel工作簿中建一工作表，其名为缺省值 Sheet0
        //Sheet sheet = workbook.createSheet();

        //2、如要新建一名为"会员登录统计"的工作表，其语句为：
        Sheet sheet = workbook.createSheet("观众统计表");


        //3、创建行（row 1）

        Row row1 = sheet.createRow(0);


        //4、创建单元格（col 1-1）
        Cell cell11 = row1.createCell(0);
        cell11.setCellValue("今日新增关注");

        // 创建单元格（col 1-2）
        Cell cell12 = row1.createCell(1);
        cell12.setCellValue(999);


        // 创建行（row 2）
        Row row2 = sheet.createRow(1);

        // 创建单元格（col 2-1）
        Cell cell21 = row2.createCell(0);
        cell21.setCellValue("统计时间");

        //创建单元格（第三列）
        Cell cell22 = row2.createCell(1);

        String dateTime = new DateTime().toString("YYYY-MM-dd HH:mm:ss");
        cell22.setCellValue(dateTime);

        FileOutputStream fileOutputStream = new FileOutputStream(path+"/观众统计表07.xlsx");

        workbook.write(fileOutputStream);

        fileOutputStream.close();
        System.out.println("文件生成成功！");
    }


    /**
     * 测试写excel03-HSSFWorkbook 大数据量写
     *
     * @author byron
     * @since 2024/8/21 9:43
     */
    @Test
    public void testWrite03BigData() throws IOException {

        long begin = System.currentTimeMillis();

        //和03版唯一的区别是创建类型不同 XSSFWorkbook，HSSFWorkbook
        // 文件后缀名不同

        //1、创建新的Excel 工作簿
        Workbook workbook = new HSSFWorkbook();


        //2、在Excel工作簿中建一工作表
        Sheet sheet = workbook.createSheet();


        for (int rowNum = 0; rowNum < 65537; rowNum++) {
            //3、创建行（row 1）

            Row row = sheet.createRow(rowNum);

            //创建单元格
            for (int cellNum = 0; cellNum < 10; cellNum++) {

                Cell cell = row.createCell(cellNum);
                cell.setCellValue(cellNum);
            }
        }


        FileOutputStream fileOutputStream = new FileOutputStream(path+"/表03-大数据量.xls");

        workbook.write(fileOutputStream);

        fileOutputStream.close();
        System.out.println("文件生成成功！");

        long end = System.currentTimeMillis();


        //耗时：1.195
        System.out.printf("耗时："+(double)(end-begin)/1000);

    }


    /**
     * 测试写excel07- XSSFWorkbook 大数据量写
     *
     * @author byron
     * @since 2024/8/21 9:43
     */
    @Test
    public void testWrite07BigData() throws IOException {

        long begin = System.currentTimeMillis();

        //和03版唯一的区别是创建类型不同 XSSFWorkbook，HSSFWorkbook
        // 文件后缀名不同

        //1、创建新的Excel 工作簿
        Workbook workbook = new XSSFWorkbook();


        //2、在Excel工作簿中建一工作表
        Sheet sheet = workbook.createSheet();


        for (int rowNum = 0; rowNum < 65536; rowNum++) {
            //3、创建行（row 1）

            Row row = sheet.createRow(rowNum);

            //创建单元格
            for (int cellNum = 0; cellNum < 10; cellNum++) {

                Cell cell = row.createCell(cellNum);
                cell.setCellValue(cellNum);
            }
        }


        FileOutputStream fileOutputStream = new FileOutputStream(path+"/表07-大数据量.xlsx");

        workbook.write(fileOutputStream);

        fileOutputStream.close();
        System.out.println("文件生成成功！");

        long end = System.currentTimeMillis();

        //耗时：7.039
        System.out.printf("耗时："+(double)(end-begin)/1000);

    }


    /**
     * 测试写excel07- SXSSFWorkbook 大数据量写(改良版)
     *
     * @author byron
     * @since 2024/8/21 9:43
     */
    @Test
    public void testWrite07BigDataFast() throws IOException {

        long begin = System.currentTimeMillis();

        //和03版唯一的区别是创建类型不同 XSSFWorkbook，HSSFWorkbook
        // 文件后缀名不同

        //1、创建新的Excel 工作簿
        Workbook workbook = new SXSSFWorkbook();


        //2、在Excel工作簿中建一工作表
        Sheet sheet = workbook.createSheet();


        for (int rowNum = 0; rowNum < 100000; rowNum++) {
            //3、创建行（row 1）

            Row row = sheet.createRow(rowNum);

            //创建单元格
            for (int cellNum = 0; cellNum < 10; cellNum++) {

                Cell cell = row.createCell(cellNum);
                cell.setCellValue(cellNum);
            }
        }


        FileOutputStream fileOutputStream = new FileOutputStream(path+"/表07-大数据量-改良.xlsx");

        workbook.write(fileOutputStream);

        fileOutputStream.close();
        System.out.println("文件生成成功！");

        //清除临时文件
        ((SXSSFWorkbook) workbook).dispose();

        long end = System.currentTimeMillis();

        //耗时：1.856
        System.out.printf("耗时："+(double)(end-begin)/1000);

    }
}
